iT邦幫忙

2025 iThome 鐵人賽

DAY 18
1

在前幾天的專案架構練習中,我們已經學會了模組化與檔案拆分的重要性,知道如何把資源按功能分類、建立可重用模組。今天,我們要把同樣的思維延伸到 多環境管理,讓同一套程式碼可以應用在 開發 (Dev)、測試 (Test)、正式 (Prod) 等環境,而不需要為每個環境複製整個專案。

Terraform 提供了 Workspace 功能來解決這個需求:每個 Workspace 對應一個獨立的 state,讓不同環境互不干擾,又能共用相同的程式碼和模組!

什麼是 Workspace?

Workspace 可以想像成 Terraform 的「環境隔間」。

在同一個專案資料夾下,可以同時存在多個 Workspace,每個 Workspace 都會有自己的 state 檔:

  • default:預設 Workspace,如果不額外建立,所有操作都在這裡
  • dev / test / prod:自訂 Workspace,管理不同環境資源

使用 Workspace 有幾個好處:

  1. 環境隔離:Dev 的資源不會影響 Test,也不會影響 Prod。
  2. 統一程式碼:不用為不同環境複製程式碼,可以減少維護成本。
  3. 自動命名資源:利用 ${terraform.workspace} 可以為每個環境自動加上名稱後綴。
  4. 清楚管理 State:每個 Workspace 有自己獨立的 state 檔案,可以避免誤刪或誤修改。

Workspace 常用指令

# 查看目前 Workspace
terraform workspace list

# 建立新 Workspace
terraform workspace new <name>

# 切換 Workspace
terraform workspace select <name>

# 顯示目前 Workspace
terraform workspace show

# 刪除 Workspace
terraform workspace delete <name>

💡 小提醒:建立新的 Workspace 時,Terraform 會創建一個空白 state,確保新的環境不會看到其他環境的資源。

測試組態檔 (GCP GCE VM 為例)

這邊是一個簡單的 GCP Compute Engine 範例,透過 Workspace 可以讓不同環境的 VM 自動命名:

provider "google" {
  project = var.project_id
  region  = var.region
}

resource "google_compute_instance" "example" {
  name         = "web-${terraform.workspace}"
  machine_type = var.machine_type
  zone         = var.zone

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-12"
    }
  }

  network_interface {
    network = "default"
    access_config {}
  }

  tags = ["${terraform.workspace}"]
}

output "instance_name" {
  value = google_compute_instance.example.name
}

${terraform.workspace} 會自動套用目前 Workspace 名稱,所以部署在 dev 環境時,instance 會被命名為 web-dev。

建立 Dev Workspace

terraform workspace new dev
Created and switched to workspace "dev"!

切換到 dev Workspace 後,我們可以使用對應的變數檔 dev.tfvars 進行 apply:

terraform apply -var-file=dev.tfvars

輸出結果:

Outputs:
instance_name = web-dev

使用 terraform show 可以確認 state,只有 Dev 環境的資源。

第一次建立 Workspace 時,Terraform 會告訴你這是一個新的空白環境,因此 apply 時只會看到該 Workspace 下的資源。

建立 Test Workspace

terraform workspace new test
Created and switched to workspace "test"!

同樣地,使用 Test 變數檔:

terraform apply -var-file=test.tfvars

輸出結果:

Outputs:
instance_name = web-test

切換到 Test Workspace 後,terraform show 會顯示空的 state(除非你已經 apply 過),確保 Dev 資源不受影響。

Workspace 資料儲存方式

$ tree
.
├── dev.tfvars
├── test.tfvars
├── main.tf
└── terraform.tfstate.d
    ├── dev
    │   └── terraform.tfstate
    └── test
        └── terraform.tfstate

每個 Workspace 都有自己的資料夾與 state 檔案,互不干擾。

目前使用的 Workspace 也會存放在 .terraform/environment

$ cat .terraform/environment
test

移除測試資料

測試完畢後,我們可以刪除各 Workspace 的資源:

# 刪除 Test 環境
terraform workspace select test
terraform destroy -var-file=test.tfvars

# 刪除 Dev 環境
terraform workspace select dev
terraform destroy -var-file=dev.tfvars

💡 小提醒:Terraform destroy 也會依照 Workspace 刪除對應環境資源,不會影響其他 Workspace。

總結一下

Workspace 是 Terraform 提供的一個多環境管理工具,它可以讓每個環境都有自己獨立的 state,互不干擾,這樣 Dev、Test、Prod 就不會互相搞亂。再加上 ${terraform.workspace} 這個變數,你可以自動幫每個環境的資源命名,不需要手動去改名字。搭配不同的變數檔,就能輕鬆為每個環境傳入不同設定。這個方式不只適用在 GCP,也可以用在 AWS 或 Azure,對 CI/CD 的多環境自動化部署來說,是非常方便又好用的!


上一篇
Day 17 - 專案架構與檔案組織:從混亂到井然有序
下一篇
Day 19 - Resource Lifecycle 管理:create_before_destroy、prevent_destroy、Ignore changes
系列文
30 天 Terraform 學習筆記:從零開始的 IaC 實戰20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言